package com.ushine.web.component.packaging;
/**
 * 引用：
 * <p>
 * （1） 引用可以看作是一种数据类型（保存在stack中），保存了对象在内存（heap，堆空间）中的地址，它和类实例(对象)是不一样的；
 * （2） 不同的引用可能指向同一个对象，换句话说，一个对象可以有多个引用，即该类类型的变量。
 * 比如说String    a = “hello”; String b = “hello”;这时候a和b都指向了对象“hello“<注意：字符串是对象>
 * <p>
 * 包装类：
 * Java提供的包装类分为两种：一种是对象型包装类（不继承任何其他类(Object的直接子类)，包括Boolean、Character），
 * 另一种是数值型包装类（继承于Number类，包括Byte、Short、Integer、Long、Float、Double）
 * <p>
 * 拆箱与装箱：
 * 装箱：
 *   将基本数据类型封装为包装类对象，利用每一个包装类提供的构造方法实现装箱操作。例如：Integer integer1 = 1;
 * <p>
 * 拆箱:
 *   将包装类中包装的基本数据类型数据取出。int integer2 = integer.;
 * <p>
 * 自动装箱的内存复用：
 * 自动装箱时，对于Integer x= ？，如果var指向的对象在-128~127范围内的赋值时，生成的Integer实例化对象是由 IntegerCache.cache() 方法产生，它会复用已有对象。和String的共享池操作是一个道理，cache()方法会将位于-128~127范围内产生的Integer对象入池，下次使用的时候，从池中拿去，就不会在创建了。
 * (常量池) 对于Integer、Short、Byte、Character、Long 这些包装类，都有一个常量池，常量池的范围是-128~127之间。如果定义的包装类的值在这个范围内，则会直接返回内部缓存池中已经存在的对象的引用，而对于浮点型Float和Double这样的包装类，没有常量池机制，不管传入的值是多少，都会new一个新的对象。
 * 而对于手动装箱，即采用new进行包装类创建时，不会发生内存复用，因为new关键字每次使用，都会开辟新的空间，这和String采用构造 方法创建字符串不入池相对应。
 */